//Egg Pawns by Sonic1983
freeslot("MT_EGGPAWN", "SFX_PAWN1", "SFX_PAWN2", "SFX_PAWN3", "SFX_PAWN4", "S_ALART_WHAT1", "S_ALART_WHAT2")

function A_PawnParticles(pawn)
	if pawn
		for i = 1, 6
			if i <= 1
				local broked = P_SpawnMobj(pawn.x, pawn.y, pawn.z+4*FRACUNIT, MT_BROKENROBOT)
				broked.state = S_BROKENROBOTA
				broked.color = SKINCOLOR_ORANGE
				broked.colorized = true
				broked.scale = FRACUNIT*3/2
				P_SetObjectMomZ(broked, P_RandomRange(4, 16)*FRACUNIT)
				P_InstaThrust(broked, P_RandomRange(1, 360)*ANG1, P_RandomRange(4, 32)*FRACUNIT)
			else
				local broked = P_SpawnMobj(pawn.x, pawn.y, pawn.z+4*FRACUNIT, MT_BROKENROBOT)
				broked.state = S_BROKENROBOTB
				broked.color = SKINCOLOR_ORANGE
				broked.colorized = true
				broked.scale = FRACUNIT*3/2
				P_SetObjectMomZ(broked, P_RandomRange(4, 16)*FRACUNIT)
				P_InstaThrust(broked, P_RandomRange(1, 360)*ANG1, P_RandomRange(4, 32)*FRACUNIT)
			end
		end
	end
end

addHook("MobjThinker", function(pawn)
	if pawn
	and pawn.health
	and pawn.valid
	and pawn.type == MT_EGGPAWN

		if pawn.footstep == nil
			pawn.footstep = 0
		end
		if pawn.footstep >= 0
			pawn.footstep = $1 - 1
		end

		if ((pawn.state == S_EGGPAWN_WALK1) or (pawn.state == S_EGGPAWN_WALK2) or (pawn.state == S_EGGPAWN_WALK3) or (pawn.state == S_EGGPAWN_WALK4))
			if P_IsObjectOnGround(pawn) 
				P_Thrust(pawn, pawn.angle, FRACUNIT/3)
			end 
			if pawn.footstep <= 0
				S_StartSound(pawn, sfx_pawn1)
				pawn.footstep = 10
			end
			if pawn.reactiontime
				pawn.reactiontime = $1 - 1
			else
				pawn.reactiontime = pawn.info.reactiontime
				pawn.angle = P_RandomRange(1, 360)*ANG1
			end
		end

		if ((pawn.state == S_EGGPAWN_RUN1) or (pawn.state == S_EGGPAWN_RUN2) or (pawn.state == S_EGGPAWN_RUN3) or (pawn.state == S_EGGPAWN_RUN4))
			if P_IsObjectOnGround(pawn) 
				P_Thrust(pawn, pawn.angle, FRACUNIT)
			end 
			if pawn.footstep <= 0
				S_StartSound(pawn, sfx_pawn1)
				pawn.footstep = 8
				P_SpawnMobj(pawn.x, pawn.y, pawn.z, MT_SPINDUST)
			end
			if pawn.target
			and pawn.target.type == MT_PLAYER
				pawn.angle = R_PointToAngle2(pawn.x, pawn.y, pawn.target.x, pawn.target.y)
			end
		end

		if pawn.target == nil
			if P_LookForPlayers(pawn, 1024*FRACUNIT)
			and ((pawn.state == S_EGGPAWN_WALK1) or (pawn.state == S_EGGPAWN_WALK2) or (pawn.state == S_EGGPAWN_WALK3) or (pawn.state == S_EGGPAWN_WALK4) or (pawn.state == S_EGGPAWN_STAND))
				pawn.state = S_EGGPAWN_RUN1
				S_StartSound(pawn, pawn.info.seesound)
				local alart = P_SpawnMobj(pawn.x, pawn.y, pawn.z+pawn.height+8*FRACUNIT, MT_GHOST)
				alart.fuse = 2*TICRATE
				alart.state = S_ALART1
			end
		end

		if pawn.target
		and pawn.target.type == MT_PLAYER
			if R_PointToDist2(pawn.x, pawn.y, pawn.target.x, pawn.target.y) > 1025*FRACUNIT
			or not P_CheckSight(pawn, pawn.target)
				S_StartSound(pawn, sfx_pawn3)
				pawn.state = S_EGGPAWN_LOST1
				pawn.target = nil
				local alart = P_SpawnMobj(pawn.x, pawn.y, pawn.z+pawn.height+8*FRACUNIT, MT_GHOST)
				alart.fuse = 2*TICRATE
				alart.state = S_ALART_WHAT1
			end
			if ((pawn.state == S_EGGPAWN_WALK1) or (pawn.state == S_EGGPAWN_WALK2) or (pawn.state == S_EGGPAWN_WALK3) or (pawn.state == S_EGGPAWN_WALK4) or (pawn.state == S_EGGPAWN_STAND))
			and not ((pawn.state == S_EGGPAWN_RUN1) or (pawn.state == S_EGGPAWN_RUN2) or (pawn.state == S_EGGPAWN_RUN3) or (pawn.state == S_EGGPAWN_RUN4))
			and P_LookForPlayers(pawn, 1024*FRACUNIT)
				pawn.state = S_EGGPAWN_RUN1
				S_StartSound(pawn, pawn.info.seesound)
				local alart = P_SpawnMobj(pawn.x, pawn.y, pawn.z+pawn.height+8*FRACUNIT, MT_GHOST)
				alart.fuse = 2*TICRATE
				alart.state = S_ALART1
			end
		end
	end
end, MT_EGGPAWN)

addHook("MobjDeath", function(pawn, inf, mo)
	if pawn
	and pawn.type == MT_EGGPAWN
		if mo
		and mo.player
			S_StartSound(pawn, sfx_pawn4)
			pawn.flags = $1 & ~(MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT)
			pawn.flags = $1|MF_BOUNCE
			pawn.angle = R_PointToAngle2(pawn.x, pawn.y, mo.x, mo.y)
			P_InstaThrust(pawn, R_PointToAngle2(pawn.x, pawn.y, mo.x, mo.y)+P_RandomRange(-20, 20)*ANG1, -FixedHypot(mo.momx, mo.momy)-P_RandomRange(-32, 32)*FRACUNIT)
			pawn.momz = P_AproxDistance(mo.momx, mo.momy)/P_RandomRange(2, 8)
		end
		if mo
		and not (mo.type == MT_PLAYER)
			S_StartSound(pawn, sfx_pawn4)
			pawn.flags = $1 & ~(MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT)
			pawn.flags = $1|MF_BOUNCE
			pawn.angle = R_PointToAngle2(pawn.x, pawn.y, mo.x, mo.y)
			P_InstaThrust(pawn, R_PointToAngle2(pawn.x, pawn.y, mo.x, mo.y), P_RandomRange(4, 16)*FRACUNIT)
			P_SetObjectMomZ(pawn, P_RandomRange(4, 16)*FRACUNIT)
		end
	end
end, MT_EGGPAWN)

addHook("MobjThinker", function(pawn)
	if pawn
	and not pawn.health
	and pawn.valid
	and pawn.type == MT_EGGPAWN
		pawn.angle = $1 + ANG20
		if P_IsObjectOnGround(pawn)
		and (pawn.state == S_EGGPAWN_HURT)
		and pawn.momz == 0
			pawn.state = S_EGGPAWN_POSTDEAD
		end
	end
end, MT_EGGPAWN)

addHook("MobjMoveBlocked", function(pawn)
	if pawn
	and pawn.health
	and pawn.valid
	and pawn.type == MT_EGGPAWN
		if ((pawn.state == S_EGGPAWN_WALK1) or (pawn.state == S_EGGPAWN_WALK2) or (pawn.state == S_EGGPAWN_WALK3) or (pawn.state == S_EGGPAWN_WALK4))
			P_BounceMove(pawn)
			pawn.angle = R_PointToAngle2(0, 0, pawn.momx, pawn.momy)
		end
	end
end, MT_EGGPAWN)
